package com.zy.crypto;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.nio.ByteBuffer;
import java.nio.charset.Charset;

/**
 * BASE64工具类,对JAVA原生态BASE64处理做了封装,不抛异常<br>
 */
public class BASE64Coding {

	/**
	 * <b>按系统默认编码encode字符串</b><br>
	 * <b>Author：</b>Dark Light<br>
	 * <b>Date：</b>2016年8月15日<br>
	 * 
	 * @param str
	 * 
	 * @return String
	 */
	public static String encode(String str) {
		String result = new BASE64Encoder().encode(str.getBytes());
		return result.replaceAll("\\r\\n", "");
	}

	/**
	 * <b>按指定编码encode字符串</b><br>
	 * <b>Author：</b>Dark Light<br>
	 * <b>Date：</b>2016年8月15日<br>
	 * 
	 * @param str
	 * @param charsetName
	 * 
	 * @return String
	 */
	public static String encode(String str, String charsetName) {
		String result = "";
		Charset charset = Charset.forName(charsetName);
		if (charset != null) {
			result = new BASE64Encoder().encode(str.getBytes(charset));
		} else {
			result = new BASE64Encoder().encode(str.getBytes());
		}
		return result.replaceAll("\\r\\n", "");
	}

	/**
	 * <b>对字节数组进行encode</b><br>
	 * <b>Author：</b>Dark Light<br>
	 * <b>Date：</b>2016年8月15日<br>
	 * 
	 * @param bytes
	 * 
	 * @return String
	 */
	public static String encode(byte[] bytes) {
		String result = new BASE64Encoder().encode(bytes);
		return result.replaceAll("\\r\\n", "");
	}

	/**
	 * <b>对ByteBuffer进行encode</b><br>
	 * <b>Author：</b>Dark Light<br>
	 * <b>Date：</b>2016年8月15日<br>
	 * 
	 * @param buf
	 * 
	 * @return String
	 */
	public static String encode(ByteBuffer buf) {
		String result = new BASE64Encoder().encode(buf);
		return result.replaceAll("\\r\\n", "");
	}

	/**
	 * <b>对BASE64的字符串进行decode,若decode失败返回null</b><br>
	 * <b>Author：</b>Dark Light<br>
	 * <b>Date：</b>2016年8月15日<br>
	 * 
	 * @param str
	 * 
	 * @return byte[]
	 */
	public static byte[] decodeBuffer(String str) {
		try {
			return new BASE64Decoder().decodeBuffer(str);
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * <b>按系统默认编码decode字符串,若decode失败返回""</b><br>
	 * <b>Author：</b>Dark Light<br>
	 * <b>Date：</b>2016年8月15日<br>
	 * 
	 * @param str
	 * 
	 * @return String
	 */
	public static String decode(String str) {
		String result = "";
		try {
			byte[] bytes = new BASE64Decoder().decodeBuffer(str);
			result = new String(bytes);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * <b>按指定编码decode字符串,若decode失败返回""</b><br>
	 * <b>Author：</b>Dark Light<br>
	 * <b>Date：</b>2016年8月15日<br>
	 * 
	 * @param str
	 * @param charsetName
	 * 
	 * @return String
	 */
	public static String decode(String str, String charsetName) {
		String result = "";
		try {
			Charset cs = Charset.forName(charsetName);
			if (cs != null) {
				byte[] bytes = new BASE64Decoder().decodeBuffer(str);
				result = new String(bytes, charsetName);
			} else {
				result = decode(str);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	public static void main(String[] args) {
		String s = "123456";
		String str = BASE64Coding.encode(s);
		System.out.println(str);
		System.out.println(BASE64Coding.decode(str));
	}

}
